跳到主要内容

01 IIC

up的视频讲解

从两条共享总线开始,理解开漏、时钟、地址和应答怎样配合完成通信。

1 两条线连接多个设备​

IIC(I²C) 是集成电路间总线。SCL 是串行时钟线,SDA 是串行数据线。多个设备可以连接到同一组线路,由地址区分通信对象。

共享时钟和数据线,主设备通过地址选择需要通信的从设备。
共享时钟和数据线,主设备通过地址选择需要通信的从设备。

与 UART 的独立收发线不同,IIC 的发送和接收共用 SDA,因此同一时刻只沿一个方向传输。主设备组织通信并产生时钟,从设备按照约定参与收发。

2 为什么使用开漏和上拉​

开漏输出只能主动拉低或释放线路。所有设备释放时,上拉电阻使总线回到高电平;任何一个设备拉低,总线就为低电平。

没有设备主动向总线强推高电平,多个设备才能协同控制线路。
没有设备主动向总线强推高电平,多个设备才能协同控制线路。

这形成了“线与”的效果:只要有一个参与者给出低电平,整体就为低电平。它也为时钟拉伸提供了条件。

时钟拉伸​

从设备还没有准备好时,可以保持 SCL 为低电平;主设备释放线路后,需要等它真正回到高电平再继续相应时序。

观察从设备如何延长时钟低电平,而不是另外产生一套时钟。
观察从设备如何延长时钟低电平,而不是另外产生一套时钟。

上拉电阻与速度​

上拉电阻和总线电容共同影响上升速度。电阻过大,上升沿可能变慢;电阻过小,拉低时的电流增大。以常见的 4.7 kΩ 为例,实际仍需结合总线负载和器件要求。

比较上升速度与电流的取舍,再理解标准模式和快速模式。
比较上升速度与电流的取舍,再理解标准模式和快速模式。

课程涉及 100 kHz 标准模式与 400 kHz 快速模式。总线的高电平由上拉电源决定,连接设备前要确认所有引脚都能承受该电压。

3 从开始到结束读懂一次传输​

先识别开始和停止,再逐字节观察数据与应答。
先识别开始和停止,再逐字节观察数据与应答。
时序SCL 与 SDA 的配合
开始SCL 为高时,SDA 由高变低
数据通常在 SCL 为低时改变 SDA,在高电平期间保持数据稳定
应答 ACK第九个时钟由接收方拉低 SDA
停止SCL 为高时,SDA 由低变高

数据以字节为单位传输,高位先发送。每个字节后都有应答时段;开始与停止则界定一次传输,而不是每个字节都重新开始一次。

主设备写时,主设备发送数据,从设备接收;主设备读时,从设备发送数据,主设备接收。应答由接收方产生,接收结束还需要按协议处理非应答和停止。

4 地址如何选中设备​

常用的 7 位地址方式,在起始后的地址字节中包含 7 位从设备地址和 1 位读写方向。读写位为 0 表示写,为 1 表示读。

将设备地址与读写方向分开,避免把它们当成同一个数值。
将设备地址与读写方向分开,避免把它们当成同一个数值。

协议也定义了 10 位地址方式。课程先以常见的 7 位寻址为主,读驱动时再核对函数参数需要的是哪一种地址表达方式。

5 外设怎样处理这些时序​

时钟控制器产生主设备时钟;地址寄存器和比较器参与从设备地址识别;逻辑控制器组织开始、停止、应答以及数据移位。

主设备写:数据从程序进入数据寄存器,再由移位通路送到 SDA。
主设备写:数据从程序进入数据寄存器,再由移位通路送到 SDA。

接收方向则相反:串行数据进入移位寄存器,完整数据转入数据寄存器,再通知程序读取。

主设备读:数据由从设备送出,主设备继续组织时钟和接收。
主设备读:数据由从设备送出,主设备继续组织时钟和接收。

下一节 OLED 实验会把抽象的地址与数据转换成可见的像素显示。